{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "82ae535a-a041-40f0-8c40-e689b894b0bc",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "if \"pyodide\" in sys.modules:\n",
    "    import piplite\n",
    "    await piplite.install('pyb2d-jupyterlite-backend>=0.4.0')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "7381ff66-7924-4216-b141-8f7b15ed038a",
   "metadata": {},
   "outputs": [],
   "source": [
    "from b2d.testbed import TestbedBase\n",
    "import b2d\n",
    "\n",
    "\n",
    "class NewtonsCradle(TestbedBase):\n",
    "\n",
    "    name = \"newton's cradle\"\n",
    "\n",
    "    def __init__(self, settings=None):\n",
    "        super(NewtonsCradle, self).__init__(settings=settings)\n",
    "\n",
    "        # radius of the circles\n",
    "        r = 1.0\n",
    "        # length of the rope\n",
    "        l = 10.0\n",
    "        # how many balls\n",
    "        n = 10\n",
    "\n",
    "        offset = (l + r, 2 * r)\n",
    "        dynamic_circles = []\n",
    "        static_bodies = []\n",
    "        for i in range(n):\n",
    "            if i + 1 == n:\n",
    "                position = (offset[0] + i * 2 * r + l, offset[1] + l)\n",
    "            else:\n",
    "                position = (offset[0] + i * 2 * r, offset[1])\n",
    "\n",
    "            circle = self.world.create_dynamic_body(\n",
    "                position=position,\n",
    "                fixtures=b2d.fixture_def(\n",
    "                    shape=b2d.circle_shape(radius=r * 0.90),\n",
    "                    density=1.0,\n",
    "                    restitution=1.0,\n",
    "                    friction=0.0,\n",
    "                ),\n",
    "                linear_damping=0.01,\n",
    "                angular_damping=1.0,\n",
    "                fixed_rotation=True,\n",
    "            )\n",
    "            dynamic_circles.append(circle)\n",
    "\n",
    "            static_body = self.world.create_static_body(\n",
    "                position=(offset[0] + i * 2 * r, offset[1] + l)\n",
    "            )\n",
    "\n",
    "            self.world.create_distance_joint(\n",
    "                static_body,\n",
    "                circle,\n",
    "                local_anchor_a=(0, 0),\n",
    "                local_anchor_b=(0, 0),\n",
    "                max_length=l,\n",
    "                stiffness=0,\n",
    "            )\n",
    "\n",
    "            static_bodies.append(static_body)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "6f694d32-8b23-40cf-91c3-0edd6abb658d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b24ad88f6cfd4db19fc3145000e79635",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from pyb2d_jupyterlite_backend.async_jupyter_gui import JupyterAsyncGui\n",
    "s = JupyterAsyncGui.Settings()\n",
    "s.resolution = [1000,300]\n",
    "b2d.testbed.run(NewtonsCradle, backend=JupyterAsyncGui, gui_settings=s);"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
